package conf

import (
	"fmt"
	"gopkg.in/yaml.v3"
	"os"
)

// 将嵌套的 map 扁平化，key 用点号连接
func flattenMap(prefix string, src map[string]interface{}, dest map[string]string) {
	for k, v := range src {
		key := k
		if prefix != "" {
			key = prefix + "." + k
		}

		switch child := v.(type) {
		case map[string]interface{}:
			// 递归处理嵌套的 map
			flattenMap(key, child, dest)
		case []interface{}:
			// 处理数组类型 (如果需要)
			for i, item := range child {
				arrayKey := fmt.Sprintf("%s[%d]", key, i)

				// 如果数组元素是 map，递归处理
				if childMap, ok := item.(map[string]interface{}); ok {
					flattenMap(arrayKey, childMap, dest)
				} else {
					// 非 map 类型的数组元素直接存储
					dest[arrayKey] = fmt.Sprintf("%v", item)
				}
			}
		default:
			// 基本类型直接存储为字符串
			dest[key] = fmt.Sprintf("%v", v)
		}
	}
}

// ParseYAMLToFlatMap 读取 YAML 并解析为扁平 map
func ParseYAMLToFlatMap(yamlData []byte) (map[string]string, error) {
	// 解析 YAML 到中间 map
	var parsedMap map[string]interface{}
	err := yaml.Unmarshal(yamlData, &parsedMap)
	if err != nil {
		return nil, err
	}

	// 创建结果 map 并扁平化
	result := make(map[string]string)
	flattenMap("", parsedMap, result)

	return result, nil
}

// ParseYAMLFileToFlatMap 从文件读取 YAML 并解析为扁平 map
func ParseYAMLFileToFlatMap(filePath string) (map[string]string, error) {
	// 读取文件
	yamlData, err := os.ReadFile(filePath)
	if err != nil {
		return nil, fmt.Errorf("读取 YAML 文件失败: %v", err)
	}

	// 解析 YAML 数据
	return ParseYAMLToFlatMap(yamlData)
}
